<?php

namespace Xin\Menu\Contracts;

interface Menu
{
	/**
	 * 获取菜单数据
	 * @param callable|null $filter
	 * @return array
	 */
	public function get(callable $filter = null);

	/**
	 * 获取菜单数据
	 * @param string $app
	 * @return array
	 */
	public function getByApp(string $app);

	/**
	 * 返回菜单列表数据
	 * @param callable|null $filter
	 * @return array
	 */
	public function toList(callable $filter = null);

	/**
	 * 把一个文件添加到菜单数据中
	 * @param string $file
	 * @param string|null $app
	 * @param array $append
	 * @return void
	 */
	public function appendFile(string $file, string $app = null, array $append = []);

	/**
	 * 追加一组菜单数据
	 * @param array $menus
	 * @param string|null $app
	 * @param array $append
	 * @return void
	 */
	public function appends(array $menus, string $app = null, array $append = []);

	/**
	 * 插入一个菜单
	 *
	 * @param array $menu
	 * @param string $app
	 * @param array $append
	 */
	public function append(array $menu, string $app, array $append = []);

	/**
	 * 移除对应的菜单
	 */
	public function forget($condition);

	/**
	 * 根据app名称进行移除菜单
	 * @param string $app
	 * @return void
	 */
	public function forgetByApp(string $app);

	/**
	 * 写入数据
	 *
	 * @param string|null $targetPath
	 */
	public function export(string $targetPath = null, callable $filter = null);

	/**
	 * 清空数据
	 * @param string|null $app
	 * @param bool $isPersistent
	 * @return void
	 */
	public function clear(string $app = null, bool $isPersistent = false);

	/**
	 * 写入一组菜单
	 *
	 * @param array $menus
	 * @param string|null $app
	 * @param array $append
	 * @return array
	 */
	public function puts(array $menus, string $app = null, array $append = []);

	/**
	 * 生成菜单
	 * @param string $rule
	 * @param array $options
	 * @return mixed
	 */
	public function generate(string $rule, array $options = []);

	/**
	 * 刷新菜单
	 *
	 * @param string|null $app
	 * @return bool
	 */
	public function refresh(string $app = null, bool $detaching = true);
}
